import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.*;

/**
 * Escribe una descrición de la clase Heroe aquí.
 * 
 * @Andrés Cruz Santiago ,Jesús Aurelio Hrnández Aguilar
 * @versión 02/07/13
 */
public class Heroe extends Giant
{
    private boolean reiniciasteVida;
    private boolean hayCorazones;
    private GreenfootImage []imagenes;

    public Heroe()
    {
        //CARGADO DE IMAGENES
        imagenes= new GreenfootImage[17];
        imagenes[0]= new GreenfootImage("normal.png");
        imagenes[1]=new GreenfootImage("abj1.png");
        imagenes[2]=new GreenfootImage("abj2.png");
        imagenes[3]=new GreenfootImage("abj3.png");
        imagenes[4]=new GreenfootImage("abj4.png");
        imagenes[5]=new GreenfootImage("der1.png");
        imagenes[6]=new GreenfootImage("der2.png");
        imagenes[7]=new GreenfootImage("der3.png");
        imagenes[8]=new GreenfootImage("der4.png");
        imagenes[9]=new GreenfootImage("izq1.png");
        imagenes[10]=new GreenfootImage("izq2.png");
        imagenes[11]=new GreenfootImage("izq3.png");
        imagenes[12]=new GreenfootImage("izq4.png");
        imagenes[13]=new GreenfootImage("arb1.png");
        imagenes[14]=new GreenfootImage("arb2.png");
        imagenes[15]=new GreenfootImage("arb3.png");
        imagenes[16]=new GreenfootImage("arb4.png");
        setImage(imagenes[0]);
        reiniciasteVida=false;
        hayCorazones=true;
    }

    /**
     * Act - do whatever the BotonAtras wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        World mundo=this.getWorld();
        List aux=null;

        mueve();
        detectaFuego();
        detectaEnemigos();
        detectaCosasTangibles();
        reiniciar();

        if(cuentaNumeroActualCorazones()==0 && hayCorazones) //si coge todos los Corazones del Nivel se elimina Cofre y se da 
        {                                   //acceso a la Llave 
            aux=mundo.getObjects(Cofre.class);
            mundo.removeObjects(aux);
            Llave llave1= new Llave();
            if(this.getWorld() instanceof Room1_1)
            {
                switch(((Room1_1)getWorld()).getNivel())
                {
                    case 1: mundo.addObject(llave1, 146,166); break;
                    case 2: mundo.addObject(llave1, 31, 48); break;
                    case 3: mundo.addObject(llave1, 128, 355); break;
                    case 4: mundo.addObject(llave1, 132, 48); break;
                }
                
                
            }
            hayCorazones=false;        
        }
    }

    /**
     * Metodo que devuelve el númeor de Corazones actuales del Subnivel
     * @return numero de Corazones
     */
    public int cuentaNumeroActualCorazones()
    {
        int aux=0;
        World nuevo=this.getWorld();

        if(nuevo instanceof Room1_1)

            aux=((Room1_1)(nuevo)).getNumCorazones();
        return aux;
    }

    /**
     * Metodo para Manipular al Heroe
     */
    public void mueve()
    {
        int x=getX();
        int y=getY();

        Actor detectaArbol=null,detectaCaja=null,detectaCofre=null,detectaMuro=null;

        if (Greenfoot.isKeyDown("right"))
        {
            detectaArbol=getOneObjectAtOffset(10, 0, Arbol.class);
            detectaMuro=getOneObjectAtOffset(10,0,Muro.class);
            detectaCaja=getOneObjectAtOffset(9,0,Caja.class);
            if(detectaArbol==null && detectaMuro==null && detectaCaja==null) 
            {

                for(int i=0;i<4;i++)
                {

                    setImage(imagenes[i+5]);
                    setLocation(x+i+1,y);
                    Greenfoot.delay(1);
                }
                setImage(imagenes[5]);                
            }
            super.setDireccion(2);
        }
        if (Greenfoot.isKeyDown("left"))
        {
            detectaArbol=getOneObjectAtOffset(-10, 0, Arbol.class);
            detectaMuro=getOneObjectAtOffset(-10,0,Muro.class);
            detectaCaja=getOneObjectAtOffset(-9,0,Caja.class);
            if(detectaArbol==null && detectaMuro==null && detectaCaja==null )
            {
                for(int i=0;i<4;i++)
                {

                    setImage(imagenes[i+9]);
                    setLocation(x-i-1,y);
                    Greenfoot.delay(1);
                }
                setImage(imagenes[9]);                
            }
            super.setDireccion(3);    
        }
        if(Greenfoot.isKeyDown("down"))
        {
            detectaArbol=getOneObjectAtOffset(0,10, Arbol.class);
            detectaMuro=getOneObjectAtOffset(0,10,Muro.class);
            detectaCaja=getOneObjectAtOffset(0,9,Caja.class);
            if(detectaArbol==null && detectaMuro==null && detectaCaja==null)
            {                
                for(int i=0;i<4;i++)
                {
                    setLocation(x,y+i+1);
                    setImage(imagenes[i]);
                    Greenfoot.delay(1);
                }
                setImage(imagenes[0]);
            }
            super.setDireccion(1);
        }
        if (Greenfoot.isKeyDown("up"))
        {
            detectaArbol=getOneObjectAtOffset(0, -10, Arbol.class);
            detectaMuro=getOneObjectAtOffset(0,-10,Muro.class);
            detectaCaja=getOneObjectAtOffset(0,-9,Caja.class);
            if(detectaArbol==null && detectaMuro==null &&detectaCaja==null )
            {

                for(int i=0;i<4;i++)
                {

                    setImage(imagenes[i+13]);
                    setLocation(x,y-i-1);
                    Greenfoot.delay(1);
                }
                setImage(imagenes[13]);
            }
            super.setDireccion(0);
        }
        //this.setImage(imagenes[0]);
        if(this.isTouching(Acceso1.class))
        {
            Greenfoot.setWorld(new Room1_1(1));
        }
        if(this.isTouching(Acceso2.class))
        {
            Greenfoot.setWorld(new Room1_1(3));
        }
    }

    /**
     * Método que detecta las Lanzas de la Medusa
     */
    public void detectaFuego()
    {
        Actor balas=null;
        balas=this.getOneIntersectingObject(BalaMedusa.class);
        if (balas!=null)
        {
            reiniciasteVida=true;
        }
    }

    /**
     * Metodo que detecta cosas Tangibles
     */
    public void detectaCosasTangibles()
    {
        World mundo= this.getWorld();
        Actor tangible=null;

        tangible=this.getOneIntersectingObject(Tangible.class);
        if (tangible!=null)
        {
            if (tangible instanceof Corazon)
            {
                getWorld().removeObject (tangible);
            }
            if (tangible instanceof Llave)
            {
                getWorld().removeObject (tangible);
                if(this.getWorld() instanceof Room1_1)
                    switch(((Room1_1)getWorld()).getNivel())
                    {
                        case 1: Salida salida1 = new Salida(1);  mundo.addObject(salida1, 209, 9);break;
                        case 2: Salida salida2 = new Salida(2);  mundo.addObject(salida2, 70, 27);  break;
                        case 3: Salida salida3 = new Salida(3);  mundo.addObject(salida3, 113, 117); break;
                        case 4: Greenfoot.delay(10); Greenfoot.setWorld(new Letrero(4)); Greenfoot.delay(10);Greenfoot.setWorld(new Menu());break; 
                }

            }
            if (tangible instanceof Salida)
            {
                getWorld().removeObject (tangible);
                if(this.getWorld() instanceof Room1_1)
                    switch(((Room1_1)getWorld()).getNivel())
                    {
                        case 0: Greenfoot.delay(10); Greenfoot.setWorld(new Letrero(0));Greenfoot.setWorld(new Room1_1(1));  break;
                        case 1: Greenfoot.delay(10); Greenfoot.setWorld(new Letrero(1)); Greenfoot.delay(10); Greenfoot.setWorld(new Room1_1(2));  break;
                        case 2: Greenfoot.delay(10);  Greenfoot.delay(10);Greenfoot.setWorld(new Principal(2)); break;
                        case 3: Greenfoot.delay(10); Greenfoot.setWorld(new Letrero(3)); Greenfoot.delay(10);Greenfoot.setWorld(new Room1_1(4)); break;

                }
            }            
        }
    }

    /**
     * Método que detecta enemigos
     */
    public void detectaEnemigos()
    {
        Actor enemigo=null;
        enemigo=this.getOneIntersectingObject(Enemigo.class);
        if (enemigo!=null)
        {
            if (enemigo instanceof Snake)
            {
                reiniciasteVida=true;
                this.setLiveChange(true);             
            }
            if (enemigo instanceof Medusa)
            {
                reiniciasteVida=true;
            }
            if (enemigo instanceof Gold)
            {
                reiniciasteVida=true;
                this.setLiveChange(true);             
            }
        }
    }

    /**
     * Método que reinicia el Subnivel actual si colicionas con algún enemigo
     */
    public void reiniciar()
    {
        if (reiniciasteVida )
        {
            switch(((Room1_1)getWorld()).getNivel())
            {
                case 1: Greenfoot.setWorld(new Room1_1(1));  break;
                case 2: Greenfoot.setWorld(new Room1_1(2));  break;
                case 3: Greenfoot.setWorld(new Room1_1(3));  break;
                case 4: Greenfoot.setWorld(new Room1_1(4));  break;
            }
            reiniciasteVida=false;
        }
    }

    /**
     * @return coloca la bandera si se murio el heroe
     */
    public boolean getLiveChange()
    {
        return reiniciasteVida;
    }

    /**
     * Sets the live change a new flag.
     * @param newFlag is the flag that is going to be assigned to reiniciasteVida
     */
    public void setLiveChange(boolean bandera)
    {
        reiniciasteVida=bandera;
    }

}
